/**
 * 取基础物理伤害 取基础物理伤害(攻击方 ,挨打 ,技能名称)
 * @param {*} fight_data 
 * @param {*} src_unit 
 * @param {*} target_unit 
 * @param {*} skill_name 
 * @returns 
 */
export function get_ad_damage(fight_data, src_unit, target_unit, skill_name) {
    console.debug(`取基础物理伤害 ===> 攻击： ${src_unit["编号"]}  目标: ${target_unit["编号"]} 技能： ${skill_name}`)
    //狂暴等级：将自身防御的一部分转为伤害力
    let damage = src_unit["伤害"];
    let kb_level = src_unit["狂暴等级"] || 0;
    if (kb_level !== 0 && G.FightUnitUtils.check_unit_shen_qi_skill(src_unit, "蛮血")) {
        kb_level = kb_level * (1 + 0.16 * src_unit["神器"]["等级"] * (1 - src_unit["气血"] / src_unit["最大气血"]));
    }
    damage = Math.floor(damage + (src_unit["防御"] * kb_level));

    let defense = target_unit["防御"];

    console.debug(`damage ${damage} , defense ${defense}`)

    // 技能基础物理算法
    let skill_data = G.SkillData.default[skill_name];
    if (skill_data && skill_data["基础物理伤害"]) {
        console.debug(`基础物理伤害 ===>  skill_name ${skill_name}`);
        skill_data["基础物理伤害"](fight_data, src_unit, target_unit, damage, defense);
        console.debug(`damage ${damage} , defense ${defense}`)
    }

    // 攻击单位奇经八脉对基础物理伤害的影响
    if (src_unit["奇经八脉"] && src_unit["门派"] !== "无门派") {
        let sects_jing_mai_data = G.JingMaiData.default[src_unit["门派"]];
        // 门派统一处理
        if (sects_jing_mai_data["基础物理伤害"]) {
            console.debug(`基础物理伤害 ===>  门派 ${src_unit["门派"]}`);
            sects_jing_mai_data["基础物理伤害"](fight_data, src_unit, target_unit, damage, defense);
            console.debug(`damage ${damage} , defense ${defense}`)
        }
        // 已点经脉
        for (const key in src_unit["奇经八脉"]) {
            if (src_unit["奇经八脉"][key] && src_unit["奇经八脉"][key] === 1 && sects_jing_mai_data[key]["基础物理伤害"]) {
                console.debug(`基础物理伤害 ===>  奇经八脉 ${key}`);
                sects_jing_mai_data[key]["基础物理伤害"](fight_data, src_unit, target_unit, damage, defense);
                console.debug(`damage ${damage} , defense ${defense}`)
            }
        }
    }

    // 攻击单位法术状态对基础物理伤害的影响
    for (const key in src_unit["法术状态"]) {
        if (G.SkillData.default[key] && G.SkillData.default[key]["基础物理伤害"]) {
            console.debug(`基础物理伤害 ===>  法术状态 ${key}`);
            G.SkillData.default[key]["基础物理伤害"](fight_data, src_unit, target_unit, damage, defense);
            console.debug(`damage ${damage} , defense ${defense}`)
        }
    }

    // 被攻击单位法术状态对基础物理伤害的影响
    for (const key in target_unit["法术状态"]) {
        if (G.SkillData.default[key] && G.SkillData.default[key]["被攻击基础物理伤害"]) {
            console.debug(`被攻击基础物理伤害 ===>  法术状态 ${key}`);
            G.SkillData.default[key]["被攻击基础物理伤害"](fight_data, src_unit, target_unit, damage, defense);
            console.debug(`damage ${damage} , defense ${defense}`)
        }
    }

    // 攻击单位特殊状态对基础物理伤害的影响
    for (const key in src_unit["特殊状态"]) {
        if (G.SkillData.default[key] && G.SkillData.default[key]["基础物理伤害"]) {
            console.debug(`基础物理伤害 ===>  攻击特殊状态 ${key}`);
            G.SkillData.default[key]["基础物理伤害"](fight_data, src_unit, target_unit, damage, defense);
            console.debug(`damage ${damage} , defense ${defense}`)
        }
    }

    // 被攻击单位特殊状态对基础物理伤害的影响
    for (const key in target_unit["特殊状态"]) {
        if (G.SkillData.default[key] && G.SkillData.default[key]["被攻击基础物理伤害"]) {
            console.debug(`被攻击基础物理伤害 ===>  被攻击特殊状态 ${key}`);
            G.SkillData.default[key]["被攻击基础物理伤害"](fight_data, src_unit, target_unit, damage, defense);
            console.debug(`damage ${damage} , defense ${defense}`)
        }
    }

    //  攻击单位内丹属性对基础物理伤害的影响
    for (const key in src_unit["内丹属性"]) {
        let nei_dan_data = G.NeiDanData.default[key]
        if (nei_dan_data && nei_dan_data["基础物理伤害"]) {
            console.debug(`基础物理伤害 ===> 内丹属性 ${key}`);
            nei_dan_data["基础物理伤害"](fight_data, src_unit, target_unit, damage, defense);
            console.debug(`damage ${damage} , defense ${defense}`)
        }
    }

    //  被攻击单位内丹属性对基础物理伤害的影响
    for (const key in target_unit["内丹属性"]) {
        let nei_dan_data = G.NeiDanData.default[key]
        if (nei_dan_data && nei_dan_data["被攻击基础物理伤害"]) {
            console.debug(`被攻击基础物理伤害 ===> 内丹属性 ${key}`);
            nei_dan_data["被攻击基础物理伤害"](fight_data, src_unit, target_unit, damage, defense);
            console.debug(`damage ${damage} , defense ${defense}`)
        }
    }

    if (src_unit["类型"] === "bb") {

        // TODO 进阶特性
        if (src_unit["力破"] && target_unit["类型"] === "角色") {
            defense = defense - src_unit["力破"][0];
        }
    }

    //其他状态对伤害和防御的影响

    // TODO 符石
    if (src_unit["天降大任"]) {
        defense = defense * src_unit["天降大任"];
    }

    // 攻击修炼和防御修炼对伤害的影响
    let damage_xl = src_unit["攻击修炼"] || 0;
    let defense_xl = target_unit["防御修炼"] || 0;

    let damage_ratio = get_ad_damage_ratio(src_unit, target_unit);

    // 伤害减防御得出伤害
    damage = Math.floor((damage * damage_ratio) * (1 + damage_xl * 0.02) - defense * (1 + defense_xl * 0.02) + (damage_xl - defense_xl) * 5);
    console.debug(`伤害减防御 ===>  ${damage}`);

    // 其他属性对伤害的影响
    if (src_unit["减攻击"]) {
        damage = damage * src_unit["减攻击"];
    }

    // 夜间伤害减少
    if (_SystemHourData["昼夜"] === 1 && !src_unit["特殊状态"]["夜战"] && !src_unit["特殊状态"]["昼伏夜出"] && src_unit["门派"] !== "阴曹地府") {
        damage = damage * 0.8;
    }

    if (damage < 1) {
        damage = 1;
    }

    // pk战斗伤害补充
    if (fight_data["PK战斗"]) {
        if (damage < 300) {
            return Math.floor(damage * G.RandomUtils.generate_random(110, 115) / 100);
        } else {
            return Math.floor(damage * G.RandomUtils.generate_random(95, 115) / 100);
        }
    }
    let data = Math.floor(damage * G.RandomUtils.generate_random(95, 105) / 100);
    console.debug(`取基础物理伤害 ===>  ${data}`);
    return data;
}

/**
 * 取伤害基数
 * @param {*} src_unit 
 * @param {*} target_unit 
 * @returns 
 */
function get_ad_damage_ratio(src_unit, target_unit) {
    console.debug(`取伤害基数 =====> 攻击编号: ${src_unit["编号"]} 被攻击编号: ${target_unit["编号"]}`);
    if (src_unit["类型"] === "角色" && target_unit["认证码"]) { //人VS宠
        console.debug(`取伤害基数 =====> 人VS宠 : ${0.9}`);
        return 0.9;
    } else if (src_unit["认证码"] && target_unit["类型"] === "怪物") { //宠VS怪
        console.debug(`取伤害基数 =====> 宠VS怪 : ${1.1}`);
        return 1.1;
    } else if (target_unit["类型"] === "怪物" && src_unit["认证码"]) { //怪VS宠
        console.debug(`取伤害基数 =====> 怪VS宠 : ${0.9}`);
        return 0.9;
    } else if (target_unit["类型"] === "怪物" && src_unit["类型"] === "角色") { //怪VS宠
        console.debug(`取伤害基数 =====> 怪VS人 : ${1}`);
        return 1;
    }
    console.debug(`取伤害基数 =====> 人VS人/怪VS人/人VS怪 : ${1}`);
    return 1;
}

/**
 * 取最终物理伤害
 * @param {*} fight_data 
 * @param {*} src_unit 
 * @param {*} target_unit 
 * @param {*} damage 伤害
 * @param {*} kill_gl 必杀几率
 * @param {*} bj_bl 伤害倍率
 * @returns 
 */
export function get_final_ad_damage(fight_data, src_unit, target_unit, damage, kill_gl = 0, bj_bl = 0) {
    console.debug(`取最终物理伤害: src_unit : ${src_unit["编号"]} target_unit ${target_unit["编号"]} damage: ${damage} 必杀几率 : ${kill_gl}  暴击倍率 : ${bj_bl}`)

    // TODO 符石技能效果 心随我动
    if (target_unit["心随我动"] && G.RandomUtils.chance(25)) {
        damage -= target_unit["心随我动"];
    }
    if (damage < 1) {
        damage = 1;
    }

    // 攻击单位特殊状态对必杀几率的影响
    for (const key in src_unit["特殊状态"]) {
        if (G.SkillData.default[key] && G.SkillData.default[key]["物理攻击必杀几率"]) {
            console.debug(`物理攻击必杀几率 ===>  特殊状态 ${key}`);
            G.SkillData.default[key]["物理攻击必杀几率"](fight_data, src_unit, target_unit, kill_gl);
        }
    }

    // 被攻击单位特殊状态对必杀几率的影响
    for (const key in target_unit["特殊状态"]) {
        if (G.SkillData.default[key] && G.SkillData.default[key]["被物理攻击必杀几率"]) {
            console.debug(`被物理攻击必杀几率 ===>  特殊状态 ${key}`);
            G.SkillData.default[key]["被物理攻击必杀几率"](fight_data, src_unit, target_unit, damage, kill_gl);
        }
    }

    // 攻击单位法术状态对必杀几率的影响
    for (const key in src_unit["法术状态"]) {
        if (G.SkillData.default[key] && G.SkillData.default[key]["物理攻击必杀几率"]) {
            console.debug(`物理攻击必杀几率 ===>  法术状态 ${key}`);
            G.SkillData.default[key]["物理攻击必杀几率"](fight_data, src_unit, target_unit, kill_gl);
        }
    }

    // 被攻击单位法术状态对必杀几率的影响
    for (const key in target_unit["法术状态"]) {
        if (G.SkillData.default[key] && G.SkillData.default[key]["被物理攻击必杀几率"]) {
            console.debug(`被物理攻击必杀几率 ===>  法术状态 ${key}`);
            G.SkillData.default[key]["被物理攻击必杀几率"](fight_data, src_unit, target_unit, damage, kill_gl);
        }
    }

    // 攻击单位奇经八脉对必杀几率的影响
    if (src_unit["奇经八脉"] && src_unit["门派"] !== "无门派") {
        let sects_jing_mai_data = G.JingMaiData.default[src_unit["门派"]];
        // 已点经脉
        for (const key in src_unit["奇经八脉"]) {
            if (src_unit["奇经八脉"][key] === 1 && sects_jing_mai_data[key] && sects_jing_mai_data[key]["物理攻击必杀几率"]) {
                console.debug(`物理攻击必杀几率 ===>  奇经八脉 ${key}`);
                sects_jing_mai_data[key]["物理攻击必杀几率"](fight_data, src_unit, target_unit, damage, kill_gl);
            }
        }
    }

    // 被攻击单位奇经八脉对必杀几率的影响
    if (target_unit["奇经八脉"] && target_unit["门派"] !== "无门派") {
        let sects_jing_mai_data = G.JingMaiData.default[target_unit["门派"]];
        // 已点经脉
        for (const key in target_unit["奇经八脉"]) {
            if (target_unit["奇经八脉"][key] === 1 && sects_jing_mai_data[key] && sects_jing_mai_data[key]["被物理攻击必杀几率"]) {
                console.debug(`被物理攻击必杀几率 ===>  奇经八脉 ${key}`);
                sects_jing_mai_data[key]["被物理攻击必杀几率"](fight_data, src_unit, target_unit, damage, kill_gl);
            }
        }
    }

    let bj = false;

    if (!target_unit["特殊状态"]["幸运"] && kill_gl > 0) {
        let bj_level = src_unit["物理暴击等级"];

        if (src_unit["神器"] && src_unit["神器"]["佩戴"] && src_unit["法术状态"]["酣战"]) {
            bj_level += src_unit["神器"]["等级"] * src_unit["法术状态"]["酣战"]["层数"] * 20;
        }

        //必杀转换
        // TODO 抗物理暴击等级是灵饰属性
        let kill_zh = (bj_level - target_unit["抗物理暴击等级"]) * 10 / src_unit["等级"];

        kill_gl += src_unit["必杀几率"] + kill_zh + src_unit["附加必杀几率"];

        // 触发物理暴击
        if (G.RandomUtils.chance(kill_gl)) {
            // 攻击单位特殊状态对物理暴击倍率的影响
            for (const key in src_unit["特殊状态"]) {
                if (G.SkillData.default[key] && G.SkillData.default[key]["攻击物理暴击倍率"]) {
                    console.debug(`攻击物理暴击倍率 ===>  特殊状态 ${key}`);
                    G.SkillData.default[key]["攻击物理暴击倍率"](fight_data, src_unit, target_unit, bj_bl);
                }
            }
            // 被攻击单位特殊状态对物理暴击倍率的影响
            for (const key in target_unit["特殊状态"]) {
                if (G.SkillData.default[key] && G.SkillData.default[key]["被攻击物理暴击倍率"]) {
                    console.debug(`被攻击物理暴击倍率 ===>  特殊状态 ${key}`);
                    G.SkillData.default[key]["被攻击物理暴击倍率"](fight_data, src_unit, target_unit, bj_bl);
                }
            }
            // 攻击单位法术状态对物理暴击倍率的影响
            for (const key in src_unit["法术状态"]) {
                if (G.SkillData.default[key] && G.SkillData.default[key]["攻击物理暴击倍率"]) {
                    console.debug(`攻击物理暴击倍率 ===>  法术状态 ${key}`);
                    G.SkillData.default[key]["攻击物理暴击倍率"](fight_data, src_unit, target_unit, bj_bl);
                }
            }
            // 被攻击单位法术状态对物理暴击倍率的影响
            for (const key in target_unit["法术状态"]) {
                if (G.SkillData.default[key] && G.SkillData.default[key]["被攻击物理暴击倍率"]) {
                    console.debug(`被攻击物理暴击倍率 ===>  法术状态 ${key}`);
                    G.SkillData.default[key]["被攻击物理暴击倍率"](fight_data, src_unit, target_unit, bj_bl);
                }
            }
            // 攻击单位奇经八脉对物理暴击倍率的影响
            if (src_unit["奇经八脉"] && src_unit["门派"] !== "无门派") {
                let sects_jing_mai_data = G.JingMaiData.default[src_unit["门派"]];
                // 已点经脉
                for (const key in src_unit["奇经八脉"]) {
                    console.debug(`攻击物理暴击倍率 ===>  奇经八脉 ${key}`);
                    if (src_unit["奇经八脉"][key] === 1 && sects_jing_mai_data[key] && sects_jing_mai_data[key]["攻击物理暴击倍率"]) {
                        sects_jing_mai_data[key]["攻击物理暴击倍率"](fight_data, src_unit, target_unit, bj_bl);
                    }
                }
            }
            // 被攻击单位奇经八脉对物理暴击倍率的影响
            if (target_unit["奇经八脉"] && target_unit["门派"] !== "无门派") {
                let sects_jing_mai_data = G.JingMaiData.default[target_unit["门派"]];
                // 已点经脉
                for (const key in target_unit["奇经八脉"]) {
                    console.debug(`被攻击物理暴击倍率 ===>  奇经八脉 ${key}`);
                    if (target_unit["奇经八脉"][key] === 1 && sects_jing_mai_data[key] && sects_jing_mai_data[key]["被攻击物理暴击倍率"]) {
                        sects_jing_mai_data[key]["被攻击物理暴击倍率"](fight_data, src_unit, target_unit, bj_bl);
                    }
                }
            }
            // TODO 统御属性
            if (target_unit["统御属性"] && target_unit["统御属性"]["铜墙铁壁"]) {
                bj_bl = bj_bl - target_unit["统御属性"]["铜墙铁壁"];
            }
            if (G.FightUnitUtils.check_unit_shen_qi_skill(src_unit, "威服天下")) {
                bj_bl = bj_bl + 0.12 * src_unit["神器"]["等级"];
            }

            // 叠加暴击倍率
            damage = damage * bj_bl;

            // 攻击单位特殊状态对物理暴击伤害的影响
            for (const key in src_unit["特殊状态"]) {
                if (G.SkillData.default[key] && G.SkillData.default[key]["攻击物理暴击伤害"]) {
                    console.debug(`攻击物理暴击伤害 ===>  特殊状态 ${key}`);
                    G.SkillData.default[key]["攻击物理暴击伤害"](fight_data, src_unit, target_unit, damage);
                }
            }
            // 被攻击单位特殊状态对物理暴击伤害的影响
            for (const key in target_unit["特殊状态"]) {
                if (G.SkillData.default[key] && G.SkillData.default[key]["被攻击物理暴击伤害"]) {
                    console.debug(`被攻击物理暴击伤害 ===>  特殊状态 ${key}`);
                    G.SkillData.default[key]["被攻击物理暴击伤害"](fight_data, src_unit, target_unit, damage);
                }
            }
            // 攻击单位法术状态对物理暴击倍率的影响
            for (const key in src_unit["法术状态"]) {
                if (G.SkillData.default[key] && G.SkillData.default[key]["攻击物理暴击伤害"]) {
                    console.debug(`攻击物理暴击伤害 ===>  法术状态 ${key}`);
                    G.SkillData.default[key]["攻击物理暴击伤害"](fight_data, src_unit, target_unit, damage);
                }
            }

            // 被攻击单位法术状态对物理暴击倍率的影响
            for (const key in target_unit["法术状态"]) {
                if (G.SkillData.default[key] && G.SkillData.default[key]["被攻击物理暴击伤害"]) {
                    console.debug(`被攻击物理暴击伤害 ===>  法术状态 ${key}`);
                    G.SkillData.default[key]["被攻击物理暴击伤害"](fight_data, src_unit, target_unit, damage);
                }
            }
            bj = true;
        }
    }

    if (!fight_data["PK战斗"]) {
        if (src_unit["类型"] === "角色") {
            if (src_unit["奇经八脉"]["百炼"]) {
                src_unit["奇经八脉"]["百炼"] += 1;
                if (src_unit["奇经八脉"]["百炼"] === 2) {
                    src_unit["奇经八脉"]["百炼"] = 1;
                    src_unit["统计数据"]["攻击"] += 1;
                }
            } else {
                src_unit["统计数据"]["攻击"] += 1;
            }
        }
        if (target_unit["类型"] === "角色" || target_unit["认证码"]) {
            // 召唤兽每受到8下物理攻击掉1点耐久。
            target_unit["统计数据"]["挨打"] += 1;
        }
    }
    let data = { "伤害": Math.floor(damage), "动作": "挨打", "特效": [], "暴击": bj };
    console.debug(`取最终物理伤害 res =====> : ${JSON.stringify(data)}`)
    return data;
}

/**
 * 取共生目标
 * @param {*} fight_data 
 * @param {*} target_unit 
 * @returns 
 */
function get_gs_unit(fight_data, target_unit) {
    let data = [];
    fight_data["队伍数据"].forEach(team => {
        if (team[0]["队伍"] === target_unit["队伍"]) {
            team.forEach(unit => {
                if (unit["共生"] && unit["气血"] > 0) {
                    data.push(unit);
                }
            });
        }
    });
    return data;
}

/**
 * 物理共生计算
 */
export function computing_physical_damage_gs(fight_data, src_unit, target_unit, damage, dz, tx, back) {
    console.debug(`物理共生计算`)
    let tmp_unit_list = get_gs_unit(fight_data, target_unit);
    fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["返回"] = back;
    fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][0]["动作"] = dz;
    G.FightUtils.add_waiting_play_time(fight_data, 1, "物理共生");
    if (tx === undefined || tx.length === 0) {
        fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][0]["特效"] = ["被击中"];
    } else {
        fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][0]["特效"] = tx;
    }
    fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["共生"] = [];
    for (let index = 0; index < tmp_unit_list.length; index++) {
        let tmp_unit = tmp_unit_list[index];
        let die = G.FightComputingUtils.computing_remove_hp(fight_data, src_unit, tmp_unit, damage);
        fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["共生"].push({
            "编号": tmp_unit["编号"],
            "攻击方": src_unit["编号"],
            "伤害": damage,
            "死亡": die
        });
    }
}


